Lemon's blog

I春秋——web Write up(二)

Record my learning process of CTF.

字数统计: 1.8k阅读时长: 6 min
2019/09/25 Share

前言:最近都没有更新过,感觉博客快荒废了,得更新了[]~( ̄▽ ̄)~*,这次总结一下做的一些web题。

一、Not Found

在这里插入图片描述
打开页面便是404,但是下面有一个404.php,访问一下
在这里插入图片描述
除下有出题人的haha,没有其他信息了,御剑扫一下
在这里插入图片描述
打开页面,发现也没有有用的信息
在这里插入图片描述
重新回到原点,看看是不是漏掉些什么,看了出题人的提示
在这里插入图片描述
加上一个奇怪的参数
在这里插入图片描述
是不是和HTTP请求方式有关,百度查下

HTTP请求的方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式
1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

这么多请求方式,挨个试下
CONNECT请求方式,发现是Apache/2.4.7 (Ubuntu) Server
在这里插入图片描述
OPTIONS请求方式,发现有不同的地方
在这里插入图片描述
访问1.php,继续使用OPTIONS请求方式
在这里插入图片描述
没有有用的信息,查询下是否存在flag.php
在这里插入图片描述
到这里感觉又没思路了,看了大师傅的博客,发现Apache/2.4.7 (Ubuntu) Server的信息是有用的,Appache搭建的网站中,根目录下会存在.htaccess文件

简单了解一下.htaccess文件

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

访问.htaccess文件
在这里插入图片描述
访问8d829d8568e46455104209db5cd9228d.html,发现flag
在这里插入图片描述

EXEC

在这里插入图片描述
一只猫和no sign,提示说了执行、执行、执行,应该是命令执行这一类的,抓包看看是否有线索
在这里插入图片描述
发现vim,之前刚做过一个敏感信息泄露,里面就涉及到vim,这样就简单介绍一下

非正常关闭vim编辑器时(比如直接关闭终端或者电脑断电),会生成一个.swp文件,这个文件是一个临时交换文件,用来备份缓冲区中的内容,会导致程序的源码泄漏。

1
/.index.php.swp

发现确实有源码被下载了,但是是swp文件,我们需要恢复一下

1
vi -r  文件名

得到源码
在这里插入图片描述
接下来就来审计代码,先观察check函数,函数包含的代码很好理解,$number == '11259375',常规的数字肯定是绕不过去的,我们可以将number转换成十六进制,这样绕过check函数
简单解释下:

1
2
3
//11259375的十六进制为0xabcdef
$digit = ord($number{$i});//如果i=0
$digit = a //a的ascll码肯定大于9,所以可以绕过

接下来看下面的代码,发现

1
setcookie('auth','tcp tunnel is forbidden!');

这句话的意思说明TCP被禁止,简单了解一下TCP

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义

这个跟我们做的题有什么关系,看了大师傅的博客,TCP被禁止不能用curl,那再来了解一下curl

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。

POST传输cmd命令,执行后也没有回显,之前的源码中提示了flag所在的文件名,既然禁用了curl,那就用nc命令把flag文件下过来

在这里插入图片描述
然后在服务器端运行即可得出flag

1
nc -u -l -p 20000

(由于我没有一台公网能访问的服务器,所以没做这一步,但是方法没有错)
参考博客:
nc命令
curl命令
大师傅博客
vim源码泄露

Login

在这里插入图片描述
一个简易的登陆框,一开始以为是SQL注入,试了几遍看了源码,发现有账号和密码
在这里插入图片描述
登陆进去
在这里插入图片描述
一开始以为颜文字解密,结果解不开,那就抓包来看看有什么线索没
在这里插入图片描述
一开始真的没观察到,看了大师傅的博客才发现show这个参数存在猫腻(show-显示,0代表false,1代表true)
在这里插入图片描述
show值为1时,出现了源码
在这里插入图片描述
将源码复制下来,审计代码(注释是自己加的)
在这里插入图片描述
class db这一段就是检测和执行SQL查询,最重要的是下面这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(isset($requset['token']))
{
$login = unserialize(gzuncompress(base64_decode($requset['token'])));
$db = new db();//base64_decode — 对使用 MIME base64 编码的数据进行解码
$row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');//php gzcompress() 和gzuncompress()函数实现字符串压缩
if($login['user'] === 'ichunqiu')//mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符
{
echo $flag;
}else if($row['pass'] !== $login['pass']){
echo 'unserialize injection!!';
}else{
echo "(╯‵□′)╯︵┴─┴ ";
}
}else{
header('Location: index.php?error=1');
}

只要满足

1
if($login['user'] === 'ichunqiu')

即可得到flag
这里就涉及到php压缩gzcompress和解压gzuncompress字符串的方法

1
2
3
4
5
php压缩gzcompress和解压gzuncompress字符串的方法
压缩数据
base64_encode(gzcompress(serialize($data)))
解压数据
unserialize(gzuncompress(base64_decode($search_cache['data'])))

那思路就很明显了,题中是解压数据,那我们只需将ichunqiu压缩然后传递即可

然后写一个简单的php脚本跑一下

1
2
3
4
5
<?php
$login = array('user'=>'ichunqiu');
$a = base64_encode(gzcompress(serialize($login)));
echo $a
?>

在这里插入图片描述
源码中有一段代码

1
2
$requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);
//array_merge() 函数把一个或多个数组合并为一个数组

得到token值后传给cookie即可得出flag
在这里插入图片描述

总结:这次学到很多知识无论是HTTP请求方式,还是源码泄露等,这次就先总结道这里,下次继续总结!!

CATALOG
  1. 1. 一、Not Found
  2. 2. EXEC
  3. 3. Login